/*Copyright (C) 2009 - 2011 MASSART GAUTHIER

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

#include "../headers.h"

void pom_jeu(short type) {
	char contenu_titre[25], sous_titre[25];
	short continuer = 0;

	if(type == 1) {
		strcpy(contenu_titre, "PARTIE NORMALE");
	}
	else if(type == 2) {
		strcpy(contenu_titre, "PARTIE A COUPS LIMITES");
	}
	else if(type == 3) {
		strcpy(contenu_titre, "MODE AVENTURE");
	}

	clear();
	afficher_titre(contenu_titre);
	get_player_name(0, prenom);

	while(continuer != 2) {
		short MAX = 1, MIN = 1, choix = 1, nombre_mystere = 0, fin = 0, nombre_entre , tour, tour_max = 1, petit, grand, negatif = 0, i = 0;

		clear();

		if(type != 3) {
			negatif = afficher_menu("Normaux\nNégatif\n", "Voulez-vous jouer aux niveau en mode positif(simple) ou négatif(dificile):\n", contenu_titre);
			clear();
			choix = afficher_menu("Niveau 1\nNiveau 2\nNiveau 3\nNiveau 4\nNiveau 5\nNiveau personnalisé\n", "Sélectionnez votre niveau:\n", contenu_titre);
			clear();
		}
		else {
			pom_marche();
debut :
			MIN = 1;
			negatif = random(0, 1);
		}

		afficher_titre(contenu_titre);
		CSLP_ColorText(CT);

		switch(choix) {
		case 1 :
			if(negatif == 1) {
				MAX = 100;
			}
			else {
				MIN = -100;
				MAX = -1;
			}
			tour_max = 8;
			break;
		case 2 :
			if(negatif == 1) {
				MAX = 500;
			}
			else {
				MIN = -500;
				MAX = -1;
			}
			tour_max = 10;
			break;
		case 3 :
			if(negatif == 1) {
				MAX = 1000;
			}
			else {
				MIN = -1000;
				MAX = -1;
			}
			tour_max = 12;
			break;
		case 4 :
			if(negatif == 1) {
				MAX = 5000;
			}
			else {
				MIN = -5000;
				MAX = -1;
			}
			tour_max = 13;
			break;
		case 5 :
			if(negatif == 1) {
				MAX = 10000;
			}
			else {
				MIN = -10000;
				MAX = -1;
			}
			tour_max = 14;
			break;
		case 6 :
			if(negatif == 1) {

				for(MAX = 0; MAX <= 0;) {
					addstr(" Le nombre mystère se trouve entre 1 et le nombre maximum.\n\n Veulliez entrer le nombre maximum : ");
					MAX = lire_long();
					clear();
					afficher_titre(contenu_titre);
					CSLP_ColorText(CT);
				}
				if(type == 2) {
					for(tour_max = 0; tour_max <= 0;) {
						printw(" Le nombre mystère se trouve entre 1 et %ld.\n\n Veulliez entrer le nombre maximum de coup(s) que vous aurez pour retrouver le nombre mystère : ", MAX);
						tour_max = lire_long();
						clear();
						afficher_titre(contenu_titre);
						CSLP_ColorText(CT);
					}

					tour_max++;
				}
			}
			else {

				while(MIN <= 1) {
					addstr(" Le nombre mystère se trouve entre -1 et le nombre minimum.\n\n Veulliez entrer le nombre minimum : ");
					MIN = lire_long();
					clear();
					afficher_titre(contenu_titre);
					CSLP_ColorText(CT);
				}

				MIN = MIN * (-1);
				MAX = -1;

				if(type == 2) {
					for(tour_max = 0; tour_max <= 0;) {
						printw(" Le nombre mystère se trouve entre -1 et %ld.\n\n Veulliez entrer le nombre maximum de coup(s) que vous aurez pour retrouver le nombre mystère : ", MIN);
						tour_max = lire_long();
						clear();
						afficher_titre(contenu_titre);
						CSLP_ColorText(CT);
					}

					tour_max++;
				}
			}

			break;
		default :
			MAX = MIN;
			tour_max = 1;
			break;
		}

		nombre_mystere = random(MIN, MAX);
		nombre_entre = 0;
		tour = 0;
		petit = MIN;
		grand = MAX;

		if(type == 3) {
			CSLP_ColorText(COLOR_BLUE);
			sprintf(sous_titre, " NIVEAU %d ", choix);
			move(3, 0);
			afficher_sous_titre(sous_titre, true);
			CSLP_ColorText(CT);
		}

		do {
			tour++;
			if(type == 2 || type == 3) {
				tour_max--;
			}
			CSLP_ColorText(COLOR_WHITE);
			mvprintw(7, 0, " %ld ", tour);
			CSLP_ColorText(CT);
			addstr("Le nombre mystère se trouve entre ");
			CSLP_ColorText(COL_NB_SMALLER);
			printw("%ld", petit);
			CSLP_ColorText(CT);
			addstr(" et ");
			CSLP_ColorText(COL_NB_GREATER);
			printw("%ld", grand);
			CSLP_ColorText(CT);
			if(type == 2 || type == 3) {
				addstr(". Il vous reste");
				CSLP_ColorText(COLOR_WHITE);
				printw(" %ld ", tour_max);
				CSLP_ColorText(CT);
				addstr("tour(s). ");
			}
			mvaddstr(8, 0, " Quel est le nombre mystère ? ");
			CSLP_ColorText(CS);

			if(negatif != 1) {
				addstr("-");
			}

			nombre_entre = lire_long();

			if(negatif != 1) {
				nombre_entre *= (-1);
			}

			CSLP_ColorText(CT);

			if(nombre_entre == 0) {
				long retour = 0;
				clear();
				retour = afficher_menu("Oui\nNon\n", "Voulez-vous quitter la partie en cours ?\n", contenu_titre);

				if(retour == 1) {
					nombre_entre = nombre_mystere;
					fin = 1;
					clear();
				}
				else {
					clear();
					afficher_titre(contenu_titre);
					if(type == 3) {
						CSLP_ColorText(COLOR_BLUE);
						move(3, 0);
						afficher_sous_titre(sous_titre, false);
						CSLP_ColorText(CT);
					}
					tour--;
					if(type == 2 || type == 3) {
						tour_max++;
					}
				}
			}
			else if(nombre_mystere > nombre_entre) {
				CSLP_ColorText(COL_NB_GREATER);
				move(10, 0);
				afficher_centre("Le nombre mystère est plus grand !");

				if(petit > nombre_entre) {
					petit = petit;
					tour--;
					if(type == 2 || type == 3) {
						tour_max++;
					}
				}

				else if(petit < nombre_entre) {
					petit = nombre_entre;
				}

				CSLP_ColorText(CT);
			}
			else if(nombre_mystere < nombre_entre) {
				CSLP_ColorText(COL_NB_SMALLER);
				move(10, 0);
				afficher_centre("Le nombre mystère est plus petit !");

				if(grand > nombre_entre) {
					grand = nombre_entre;
				}

				else if(grand < nombre_entre) {
					grand = grand;
					tour--;
					if(type == 2 || type == 3) {
						tour_max++;
					}
				}

				CSLP_ColorText(CT);
			}

			move(6, 0);

			for(i = 0; i != 5; i++) { //Ajoute des ligne et décalle tout vers le bas
				insertln();
				refresh();
				CSLP_Sleep(50);
			}
		}
		while(nombre_entre != nombre_mystere && tour_max != 0);


		if(fin == 0) {
			if(tour_max != 0) {
				gagner();
				afficher_titre(contenu_titre);
				CSLP_ColorText(CT);
				addstr("\n Bravo ");
				CSLP_ColorText(COLOR_RED);
				addstr(prenom);
				CSLP_ColorText(CT);
				addstr(", vous avez trouvé le nombre mystère en ");
				CSLP_ColorText(COLOR_WHITE);
				printw("%ld", tour);
				CSLP_ColorText(CT);
				addstr(" tours!!!\n\n");
				getch();
				if(choix != 6) {
					if(type == 1) {
						save_score("PlusOuMoinsPN", tour, choix, 0);
					}
					else if(type == 2) {
						save_score("PlusOuMoinsPAC", tour, choix, 0);
					}
					else if(type == 3) {
						save_score("PlusOuMoinsMA", tour, choix, 0);
						if(choix < 5) {
							clear();
							if(afficher_menu("Oui\nNon\n", "Voulez-vous passer à l'étape suivante ?\n", contenu_titre) == 1) {
								clear();
								choix++;
								goto debut;
							}
						}
					}
					clear();
					afficher_titre(contenu_titre);
					CSLP_ColorText(CT);
					if(type == 1) {
						lire_suppr_score("PlusOuMoinsPN", true);
					}
					else if(type == 2) {
						lire_suppr_score("PlusOuMoinsPAC", true);
					}
					else if(type == 3) {
						lire_suppr_score("PlusOuMoinsMA", true);
					}
					getch();
				}
			}
			else {
				perdu();
				afficher_titre(contenu_titre);
				CSLP_ColorText(CT);
				addstr("La bonne réponse était : ");
				CSLP_ColorText(COLOR_GREEN);
				printw("%ld.", nombre_mystere);
				getch();
			}
		}

		if(type == 3) {
			if(tour_max != 0 && fin == 0) {
				bravo();
			}
		}

		clear();
		continuer = afficher_menu_recommencer(contenu_titre);
		clear();
	}
}

void pom_partie_normale_2(void) {
	char *contenu_titre = "PARTIE NORMALE";
	short continuer = 0;
	short fin = 0;
	long petit = 1, grand = 0, debut_barre, fin_barre;
	char prenom2[100];
	long i = 1;

	clear();
	afficher_titre(contenu_titre);
	get_player_name(2, prenom2);

	while(continuer != 2) {
		short NombreDeManches = 0, MancheActuelle = 0;
		long nombre_mystere = 0, nombre_entre = 0, tour = 0;
		short score1[50] = {0}, score2[50] = {0}, total1 = 0, total2 = 0, joueur = 1;

		clear();
		afficher_titre(contenu_titre);
		CSLP_ColorText(CT);
		addstr("\n Combien de manches voulez-vous jouer ? ");
		NombreDeManches = lire_long();
		clear();

		while(NombreDeManches != MancheActuelle || joueur != 1) {
			nombre_mystere = 0, nombre_entre = 0, tour = 0, petit = 0, grand = 0;

			if(joueur == 1)
				MancheActuelle++;

			clear();
			afficher_titre(contenu_titre);
			CSLP_ColorText(CT);
			addstr("\n Manche ");
			CSLP_ColorText(COLOR_RED);
			printw("%li ", MancheActuelle);
			CSLP_ColorText(CT);
			addstr("/");
			CSLP_ColorText(COLOR_RED);
			printw(" %li ", NombreDeManches);
			CSLP_ColorText(CT);
			addstr(".\n\n");
			CSLP_ColorText(COLOR_RED);

			if(joueur == 1)
				printw(" %s", prenom);
			else
				printw(" %s", prenom2);

			CSLP_ColorText(CT);
			addstr(" tapez le nombre que ");
			CSLP_ColorText(COLOR_RED);

			if(joueur == 1)
				addstr(prenom2);
			else
				addstr(prenom);

			CSLP_ColorText(CT);
			addstr(" devra trouver : ");
			nombre_mystere = lire_long();
			clear();
			afficher_titre(contenu_titre);
			CSLP_ColorText(CT);
			addstr("\n Veuillez entrer un indice de rechercher.\n Le nombre mistère se trouve entre 1 et :\n");
			debut_barre = nombre_mystere;
			debut_barre -= (nombre_mystere % 100) - 100;
			fin_barre = debut_barre + 5000;
			grand = fin_barre - 2500;
			grand = afficher_barre_full(debut_barre , fin_barre, 100, grand);
			clear();
			afficher_titre(contenu_titre);
			CSLP_ColorText(CT);
			addstr("\n Manche ");
			CSLP_ColorText(COLOR_RED);
			printw("%li ", MancheActuelle);
			CSLP_ColorText(CT);
			addstr("/");
			CSLP_ColorText(COLOR_RED);
			printw(" %li ", NombreDeManches);
			CSLP_ColorText(CT);
			addstr(".\n\n");
			CSLP_ColorText(COLOR_RED);

			if(joueur == 1) {
				printw(" %s", prenom2);
				CSLP_ColorText(CT);
				addstr(", à vous de jouer!");
			}
			else {
				printw(" %s", prenom2);
				CSLP_ColorText(CT);
				addstr(", à vous de jouer!");
			}

			do {
				tour++;
				CSLP_ColorText(COLOR_WHITE);
				mvprintw(12, 0, " %ld ", tour);
				CSLP_ColorText(CT);
				addstr("Le nombre mystère se trouve entre ");
				CSLP_ColorText(COL_NB_SMALLER);
				printw("%ld", petit);
				CSLP_ColorText(CT);
				addstr(" et ");
				CSLP_ColorText(COL_NB_GREATER);
				printw("%ld ", grand);
				CSLP_ColorText(CT);
				mvaddstr(13, 0, " Quel est le nombre mystère ? ");
				nombre_entre = lire_long();
				CSLP_ColorText(CT);

				if(nombre_entre == 0) {
					long retour = 0;
					clear();
					retour = afficher_menu("Oui\nNon\n", "Voulez-vous quitter la partie en cours ?\n", contenu_titre);

					if(retour == 1) {
						nombre_entre = nombre_mystere;
						fin = 1;
						clear();
					}
					else {
						clear();
						tour--;
						afficher_titre(contenu_titre);
						CSLP_ColorText(CT);
						addstr("\n Manche ");
						CSLP_ColorText(COLOR_RED);
						printw("%li ", MancheActuelle);
						CSLP_ColorText(CT);
						addstr("/");
						CSLP_ColorText(COLOR_RED);
						printw(" %li ", NombreDeManches);
						CSLP_ColorText(CT);
						addstr(".\n\n");
					}

				}

				else if(nombre_mystere > nombre_entre) {
					CSLP_ColorText(COL_NB_GREATER);
					move(15, 0);
					afficher_centre("Le nombre mystère est plus grand !");


					if(petit > nombre_entre) {
						petit = petit;
						tour--;
					}

					else if(petit < nombre_entre) {
						petit = nombre_entre;
					}

					CSLP_ColorText(CT);
				}
				else if(nombre_mystere < nombre_entre) {
					CSLP_ColorText(COL_NB_SMALLER);
					move(15, 0);
					afficher_centre("Le nombre mystère est plus petit !");


					if(grand > nombre_entre) {
						grand = nombre_entre;
					}

					else if(grand < nombre_entre) {
						grand = grand;
						tour--;
					}

					CSLP_ColorText(CT);
				}

				mvaddstr(13, 28, "\t\t\t\t");
			}
			while(nombre_entre != nombre_mystere);

			if(fin == 0) {
				clear();
				afficher_titre(contenu_titre);
				CSLP_ColorText(CT);
				addstr("\n Bravo ");
				CSLP_ColorText(COLOR_RED);

				if(joueur == 1)
					addstr(prenom2);
				else
					addstr(prenom);

				CSLP_ColorText(CT);
				printw(", vous avez retrouvé le nombre mystère en %ld tour(s) !", tour);
				getch();
				clear();

			}

			if(joueur == 1)
				score1[MancheActuelle] = tour;
			else
				score2[MancheActuelle] = tour;

			if(joueur == 1)
				joueur++;
			else
				joueur--;

			clear();
		}

		clear();

		afficher_titre(contenu_titre);
		CSLP_ColorText(COLOR_WHITE);
		addstr("\n Résultats :\n\n");

		addstr("\t┌──────────────┬───────────────────────────────────────┬───────────────────────────────────────┐\n");
		addstr("\t│XXXXXXXXXXXXXX│                                       │                                       │\n");
		addstr("\t├──────────────┼───");
		save_cursor_pos();
		pmove(HAUT, 1);
		CSLP_ColorText(COLOR_RED);
		addstr(prenom);
		CSLP_ColorText(COLOR_WHITE);
		restore_cursor_pos();
		addstr("────────────────────────────────────┼───");
		save_cursor_pos();
		pmove(HAUT, 1);
		CSLP_ColorText(COLOR_RED);
		addstr(prenom2);
		CSLP_ColorText(COLOR_WHITE);
		restore_cursor_pos();
		addstr("────────────────────────────────────┤\n");
		i = 1;

		while(score1[i] != 0) {
			printw("\t│Manche n°%ld    │   %ld tours                             │   %ld tours                             │\n", i, score1[i], score2[i]);

			if(score1[i] < score2[i]) {
				total1++;
			}
			else if(score1[i] > score2[i]) {
				total2++;
			}

			i++;
		}

		addstr("\t├──────────────┼───────────────────────────────────────┼───────────────────────────────────────┤\n");
		printw("\t│Partie gagnee │   %ld                                   │   %ld                                   │\n", total1, total2);
		addstr("\t└──────────────┴───────────────────────────────────────┴───────────────────────────────────────┘\n");
		getch();

		clear();
		continuer = afficher_menu_recommencer(contenu_titre);
		CSLP_ColorText(CT);

		if(continuer == 2) {
			clear();
		}
	}
}
